package com.splider.sdk;

import org.apache.commons.lang3.StringUtils;

import java.util.Set;

/**
 *
 *
 * 项目名称：splider
 * 类名称：MyCrawler
 * 类描述：宽度爬虫测试类
 * 创建人：qd
 * 创建时间：2020.07.06
 *
 */
public class MyCrawler {
    /**
     * initCrawlerWithSeeds(初始化种子队列)
     * @param seeds:种子url
     * @Exception 异常对象
     * @since  CodingExample　Ver(编码范例查看) 1.1
     *
     */
    private void initCrawlerWithSeeds(String [] seeds){
        for (int i = 0; i < seeds.length; i++) {
            LinkQueue.addUnvisitedUrl(seeds[i]);

        }
    }

    /**
     * crawling(抓取过程)
     * @param  seeds url种子
     * @param rule 种子的规则
     * @return String    DOM对象
     * @Exception 异常对象
     * @since  CodingExample　Ver(编码范例查看) 1.1
     *
     */
    public void  crawling(String [] seeds) {
        //定义过滤器，提取以http://news.sina.cn开头的连接
        LinkFilter filter=new LinkFilter() {
            @Override
            public boolean accept(String url) {
                if (url.startsWith("http://news.sina.cn")) {
                    return true;
                }
                return false;
            }
        };
        //初始化URL队列
        initCrawlerWithSeeds(seeds);
        while (! LinkQueue.unVisitedUrlsEmpty() && LinkQueue.getVisitedUrlNum() <=1000) {
            String visitUrl=(String) LinkQueue.unVisitedUrlDeQueue();
            //判断URL是否为空
            if (StringUtils.isBlank(visitUrl)) {
                continue;
            }
            DoloadFile doloadFile=new DoloadFile();
            //下载该网页
            doloadFile.downloadFile(visitUrl);
            //将访问过的url放入已经访问过的队列
            LinkQueue.setVisitedUrl(visitUrl);
            //提取下载网页中的URL
            Set<String> links=HtmlParseTool.extracLinks(visitUrl, filter);
            //将新的未访问的URL入队
            for (String link : links) {
                LinkQueue.addUnvisitedUrl(link);
            }
        }
    }

}
